import axios from 'axios'
import store from '@/store'
import router from '@/router'
import request from '@/utils/request'
import { Toast } from 'vant'

const service = axios.create({
  baseURL: 'http://toutiao.itheima.net/v1_0/',
  timeout: 5000
})

// 添加请求拦截器
service.interceptors.request.use(function (config) {
  const token = store.state.user.token
  // console.log(token.token)
  if (token) {
    config.headers.Authorization = `Bearer ${token.token}`
    // console.log(config.headers.Authorization)
  }
  // 在发送请求之前做些什么
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
service.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    // if (response.data.status !== 200) {
    //   return Toast(response.data.description)
    // }
    return response
  },
  async function (error) {
    // 对响应错误做点什么
    if (error.response && error.response.status === 401) {
      const token = store.getters.token
      // console.log(token)
      if (!token || !token.refresh_token) {
        // router.push('/login')
        // 代码不要往后执行了
        return
      }
      // 如果有refresh_token，则请求获取新的 token
      try {
        const res = await axios({
          method: 'PUT',
          url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
          headers: {
            Authorization: `Bearer ${token.refresh_token}`
          }
        })
        // 如果获取成功，则把新的 token 更新到容器中
        console.log('刷新 token  成功', res)
        store.commit('setToken', {
          token: res.data.data.token, // 最新获取的可用 token
          refresh_token: token.refresh_token // 还是原来的 refresh_token
        })
        // 把之前失败的用户请求继续发出去
        // config 是一个对象，其中包含本次失败请求相关的那些配置信息，例如 url、method 都有
        // return 把 request 的请求结果继续返回给发请求的具体位置
        return request(error.config)
      } catch (err) {
        // 如果获取失败，直接跳转 登录页
        console.log('请求刷线 token 失败', err)
        router.push('/login')
      }
      Toast.fail(error.response.data.message)
    }
    return Promise.reject(error)
  }
)

export default service
